package cn.mujiankeji.mbrowser.app

import cn.mujiankeji.mbrowser.app.应用接口.界面模块
import cn.mujiankeji.mbrowser.工具.JSON
import cn.mujiankeji.mbrowser.工具.mlog
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.数据.枚举类.应用页面枚举
import cn.mujiankeji.mbrowser.界面.小窗页.广告拦截.广告拦截规则管理窗口状态
import cn.mujiankeji.mbrowser.界面.小窗页.管理.用户脚本窗口状态
import cn.mujiankeji.mbrowser.界面.小窗页.设置小窗状态
import cn.mujiankeji.mbrowser.界面.小窗页.详情输入小窗页面状态
import cn.mujiankeji.mbrowser.界面.标签页.下载管理页面状态
import cn.mujiankeji.mbrowser.界面.标签页.书签.书签标签状态
import cn.mujiankeji.mbrowser.界面.标签页.关于页面状态
import cn.mujiankeji.mbrowser.界面.标签页.历史.历史标签状态
import cn.mujiankeji.mbrowser.界面.标签页.搜索引擎.搜索引擎管理页面状态
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import kotlinx.coroutines.launch
import org.koin.core.context.GlobalContext
import 操作.工具类.right
import cn.mujiankeji.mbrowser.数据.快照来源.快照源_章节列表
import cn.mujiankeji.mbrowser.数据.快照来源.快照源_列表
import cn.mujiankeji.mbrowser.数据.快照来源.快照源_视频
import cn.mujiankeji.mbrowser.数据.快照来源.快照源_阅读
import cn.mujiankeji.mbrowser.数据.枚举类.快照类型枚举
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_列表
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_视频
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_章节列表
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_阅读
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照管理页面状态

object 应用路由 {


    fun 加载(标签页状态: 标签页状态){
        界面模块().加载(标签页状态)
    }

    // --
    fun 加载(类型: 应用页面枚举){
        when(类型){
            应用页面枚举.快照管理 ->{
                界面模块().加载(快照管理页面状态())
            }
            应用页面枚举.设置 -> {
                设置小窗状态(应用页面枚举.设置).显示()
            }
            应用页面枚举.通用设置 -> {
                设置小窗状态(应用页面枚举.通用设置).显示()
            }
            应用页面枚举.隐私设置 -> {
                设置小窗状态(应用页面枚举.隐私设置).显示()
            }
            应用页面枚举.显示设置 -> {
                设置小窗状态(应用页面枚举.显示设置).显示()
            }
            应用页面枚举.搜索输入 -> {
                详情输入小窗页面状态().显示()
            }
            应用页面枚举.书签管理 -> {
                界面模块().加载(书签标签状态())
            }
            应用页面枚举.历史记录管理 -> {
                界面模块().加载(历史标签状态())
            }
            应用页面枚举.搜索引擎管理 -> {
                界面模块().加载(搜索引擎管理页面状态())
            }
            应用页面枚举.用户脚本管理->{
                用户脚本窗口状态().显示()
            }
            应用页面枚举.广告拦截管理 -> {
                广告拦截规则管理窗口状态().显示()
            }
            应用页面枚举.关于页面 -> {
                界面模块().加载(关于页面状态())
            }
            应用页面枚举.下载管理->{
                应用接口.加载(下载管理页面状态())
            }
            else -> {
                设置小窗状态(应用页面枚举.通用设置).显示()
            }
        }
    }
    fun 加载(地址 : String,来源地址 : String = "",新窗口打开 : Boolean = false){
        when(地址操作.取前缀(地址)){
            "http","https","file" -> {
                界面模块().viewModelScope.launch {
                    if (!快照匹配(地址,来源地址,新窗口打开)){
                        界面模块().加载(地址,来源地址,新窗口打开)
                    }
                }
                return
            }
            "mbrowser","mberowser","m" -> {
                加载本地页面(地址)
            }

            // 没有
            "" -> {
                地址操作.取绝对地址(地址).let {
                    if (地址操作.是否有效URL(it)){
                        界面模块().加载(it,来源地址,新窗口打开)
                        return
                    }
                }
            }

            else -> {
                应用接口.输出提示("禁止加载：$地址")
            }
        }
    }
    fun 加载网页(地址: String){
        界面模块().加载(地址)
    }

    private  inline fun <reified T> tryDecode(str : String) : T?{
        return try {
            JSON.decodeFromString<T>(str)
        } catch (e: Exception) {
            e.printStackTrace()
            mlog("e",e)
            null
        }
    }
    private suspend fun 快照匹配(地址 : String, 来源地址 : String, 新窗口打开 : Boolean) : Boolean{
        val dao = GlobalContext.get().get<AppDatabase>().快照()
        val 简要列表 = dao.获取所有启用规则简要()



        for (item in 简要列表) {
            val 匹配 = try {
                Regex(item.匹配地址).matches(地址.padStart(1,'^').padEnd(1,'$'))
            } catch (e: Exception) {
                false
            }
            mlog("load",匹配,地址,item.匹配地址)
            if (匹配) {
                val 规则 = dao.查询规则ById(item.id) ?: continue
                when (规则.类型) {
                    快照类型枚举.章节列表 -> {
                        val json = tryDecode<快照源_章节列表>(规则.规则内容)
                            ?.also {
                                it.地址 = 地址
                            }?:return false
                        界面模块().加载(快照状态_章节列表(json))
                    }
                    快照类型枚举.列表 -> {
                        val json =  tryDecode<快照源_列表>(规则.规则内容)?.also {
                            it.地址 = 地址
                        } ?: return false
                        界面模块().加载(快照状态_列表(json))
                    }
                    快照类型枚举.视频 -> {
                        val json =  tryDecode<快照源_视频>(规则.规则内容)?.also {
                            it.地址 = 地址
                        } ?: return false
                        界面模块().加载(快照状态_视频(json))
                    }
                    快照类型枚举.阅读 -> {
                        val json =  tryDecode<快照源_阅读>(规则.规则内容)?.also {
                            it.地址 = 地址
                        } ?: return false
                        界面模块().加载(快照状态_阅读(json))
                    }
                    // 未来可扩展更多类型
                    else -> {
                        // 你可以在这里处理未知类型
                    }
                }
                return true
            }
        }
        return false
    }

    fun 加载本地页面(地址 : String){
        val url = 地址.right("://")?:地址.right(":")?:地址
        mlog("url",url)
        when(url.lowercase()){
            "download","下载","下载管理" -> 加载(下载管理页面状态())
            "setup","设置"-> 设置小窗状态().显示()
            "bookmark","书签","书签管理" -> 加载(书签标签状态())
            "history","历史","历史管理" -> 加载(历史标签状态())
            "pages","页面管理","页面" -> 加载(书签标签状态())
        }
    }

    
    /**
     * 分享内容
     * @param 内容 要分享的内容
     * @param 标题 分享的标题
     */
    fun 分享(内容: String, 标题: String = "分享内容") {
        val context = GlobalContext.get().get<android.content.Context>()
        val intent = android.content.Intent(android.content.Intent.ACTION_SEND).apply {
            type = "text/plain"
            putExtra(android.content.Intent.EXTRA_SUBJECT, 标题)
            putExtra(android.content.Intent.EXTRA_TEXT, 内容)
        }
        context.startActivity(android.content.Intent.createChooser(intent, "分享到"))
    }
}